今天是Process最後一節了,撐住阿!!!!!
OS中,絕大多數情況下不是只有一個程式在跑。而是多的Process同時運作。Process之間就像一間公司一樣,可能各做各的,也可能彼此配合、傳遞資料。這就產生了「行程間通訊(IPC)」的需求。我們可以將行程分成兩類:
至於Process之間需要溝通的可能如下:
要完成IPC可以通過一下兩種方式操作:
第一,Shared Memory(共享記憶體):建立一塊記憶體區塊,讓多個行程能同時存取那塊記憶體(J個我們會在後續記憶體當中去談到)。
第二,Message Passing(訊息傳遞):Process之間用「傳送訊息」的方式來溝通,就像同桌之間的傳紙條一樣。
下圖分別表示了Shared Memory(左)與Message Passing(右)

Message Passing的精髓在於:Process之間不直接共享記憶體,而是透過傳送訊息來溝通。所以Process每一次互動就是:
send(message);    // 傳送訊息
receive(message);  // 接收訊息
而當我們在設計Message Passing時,會需要考慮以下三個問題:
第一,命名方式(Naming):就像寫信一樣。Process彼此之間需要知道「誰傳給誰」。依據Naming可以區分為:
send(P, msg):傳訊息給 P
receive(Q, msg):從 Q 收訊息
send(A, msg):傳送給信箱 A
receive(A, msg):從信箱 A 收訊息
第二,同步方式(Synchronization):當Process在傳送或接收時,要不要等對方?當 send() 和 receive() 呼叫時,會不會「等對方」?
當 send() 和 receive() 都是 blocking,稱為 rendezvous(會合點) → 雙方等彼此,成功才繼續。這邊就用表格來做呈現~
| Blocking | Non-blocking | |
|---|---|---|
| Send | 傳送後卡住,等對方收到才繼續 | 傳送後就繼續跑,不管對方有沒有收到 | 
| Receive | 沒收到就卡住,一直等 | 嘗試接收,有的話就收,沒有就回傳 null | 
第三,緩衝區設計(Buffering):送出去的訊息要暫存在哪裡?如果空間不夠,訊息就塞不進去。即使是 message passing,訊息在送達之前也要有地方暫存,即為buffer(緩衝區)。
| 類型 | 說明 | 
|---|---|
| 0 容量 (Zero Capacity) | 緩衝區不能存訊息 → send()會卡住,直到receive()把訊息收走 | 
| 有限容量 (Bounded Capacity) | 緩衝區最多可存 n筆訊息,如果滿了 →send()會等 | 
| 無限容量 (Unbounded Capacity) | 想送幾筆就送幾筆, send()永遠不會卡住(理論上) | 
到這邊,我們的Process就算告一的段落拉~~~